home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / SourceCode / Inspectors / SwapView_2.0r / SwapView.m < prev    next >
Text File  |  1995-06-12  |  4KB  |  193 lines

  1. /*
  2.  * Author: Greg Burd, Mr. Average Developer
  3.  *    (I would like to be a member of the NeXT Developer Support Team.)
  4.  *
  5.  * You may freely copy, distribute and reuse the code in this example.  
  6.  * I disclaim any warranty of any kind, expressed or implied, as to 
  7.  * its fitness for any particular use.
  8.  */
  9.  
  10. #import "SwapView.h"
  11. #import <appkit/Window.h>
  12. #import <appkit/Application.h>
  13. #import <dpsclient/psops.h>
  14. #import <dpsclient/wraps.h>
  15. #import <dpsclient/dpsNeXT.h>
  16. #import <appkit/graphics.h>
  17. #import <objc/List.h>
  18.  
  19. /**************************************************************/
  20.  
  21. /*
  22.  * Author: Greg Burd, Mr. Average Developer
  23.  *    (I would like to be a member of the NeXT Developer Support Team.)
  24.  *
  25.  * You may freely copy, distribute and reuse the code in this example.  
  26.  * I disclaim any warranty of any kind, expressed or implied, as to 
  27.  * its fitness for any particular use.
  28.  *
  29.  *
  30.  *        This contains a function that really needs to be in the
  31.  *        NX functions, so I named it as such.  It should be used when
  32.  *        coding delegate functions.
  33.  *        
  34.  *    NXAskDelegate(id delegate, SEL delegateMethod);
  35.  *    
  36.  *        Simply put it makes sure that that the delegate object is not
  37.  *        nil and that it respondsTo: the selector delegateMethod.  If it
  38.  *        does it calls the delegate with the selector and returns the result
  39.  *        otherwise it returns NULL.
  40.  */
  41.  
  42. #import <objc/objc.h>
  43.  
  44. extern void* NXAskDelegate(id delegate, SEL selector)
  45. {    
  46.     return (delegate && [delegate respondsTo:selector]);
  47. }
  48.  
  49.  
  50. /**************************************************************/
  51. @implementation SwapView
  52.  
  53. - init
  54. {
  55.     NXRect theFrame = {{0.0, 0.0}, {0.0, 0.0}};
  56.     return [self initFrame:&theFrame];
  57. }
  58.  
  59. /* designated initilizer */
  60. - initFrame:(NXRect *)theFrame
  61. {
  62.     [super initFrame:theFrame];
  63.     
  64.     lastInspector = NULL;
  65.     currentInspector = NULL;
  66.     backgroundGray = NX_LTGRAY;
  67.     
  68.     return self;
  69. }
  70.  
  71. - currentInspector
  72. {
  73.     return currentInspector;
  74. }
  75.  
  76. - lastInspector
  77. {
  78.     return lastInspector;
  79. }
  80.  
  81. - delegate
  82. {
  83.     return delegate;
  84. }
  85.  
  86. - setDelegate:(id)anObject
  87. {
  88.     delegate = anObject;
  89.     return self;
  90. }
  91.  
  92.  
  93. - (float)backgroundGray
  94. { return backgroundGray; }
  95.  
  96. - setBackgroundGray:(float)aGray
  97. {
  98.     backgroundGray = aGray;
  99.     return self;
  100. }
  101.  
  102.  
  103. /* WARNING!!!!
  104.  *
  105.  * Don't forget to make sure that the off screen windows are NOT deferred!!!
  106.  * This means make sure that you turn the Deffered switch OFF in IB when
  107.  *   looking at the Atributes inspector.  This allows offscreen drawing.  If it
  108.  *   was on, then the gstate will be zero!!!!
  109.  */
  110.  
  111.  
  112. - swapIt:sender
  113. { [self swapIt]; return self; }
  114. /* this is the real function !! */
  115. - swapIt
  116. {
  117.     NXRect theFrame;
  118.     int gstate;
  119.     id aView, inspector; 
  120.  
  121.     /* make sure the delegate impliments the whatPanel call */
  122.     if (!NXAskDelegate(delegate, @selector(whatPanel))){
  123.         //logError somewhere
  124.     };
  125.     // call the delegate
  126.     inspector = [delegate whatPanel];
  127.     
  128.     /* make sure that it is a new view to swap in */
  129.     if(lastInspector != inspector) {
  130.         if(lastInspector) {
  131.         /* remove old inspector from view hierarchy */
  132.         aView = [lastInspector contentView];
  133.         [aView removeFromSuperview];
  134.         /* and put it back */
  135.         [lastInspector setContentView:aView];
  136.         }
  137.     
  138.     /* update the offscreen view */
  139.     [inspector display];
  140.     NXPing();
  141.     
  142.     /* no inspector so clean up the background */
  143.     if(!inspector){
  144.         [self lockFocus];
  145.             /* use the backgroundGray */
  146.             PSsetgray(backgroundGray);
  147.             NXRectFill(&bounds);
  148.         [self unlockFocus];
  149.         /* now the last inspector is NULL */
  150.         lastInspector = NULL;
  151.         /* let the window server cetch up... (yawn...) */
  152.         NXPing();
  153.     }
  154.  
  155.     /* put in the new inspector */
  156.     gstate = [inspector gState];
  157.     if (gstate) {
  158.         /* get the frame to composite in */
  159.         [[inspector contentView] getFrame:&theFrame];
  160.         [self lockFocus];
  161.         /* blast the bits over to the view we locked focus on (ie. SwapView) */
  162.         PScomposite((float)theFrame.origin.x,
  163.                     (float)theFrame.origin.y,
  164.                     (float)theFrame.size.width,
  165.                     (float)theFrame.size.height,
  166.                     (int)gstate,
  167.                     (float)1.0,
  168.                     (float)1.0,
  169.                     (int)NX_COPY);
  170.         [self unlockFocus];
  171.         /* now add the subview to the SwapView for the responder chain... */
  172.         [self addSubview:[inspector contentView]];
  173.         /* and remember the panel it came from */
  174.         lastInspector = inspector;
  175.         
  176.     }
  177.     /* see whats up out there */
  178.     [[self window] flushWindow];
  179.     }
  180.  
  181.     return self;
  182. }
  183.  
  184. - free
  185. {
  186.     return [super free];
  187. }
  188.  
  189.  
  190.  
  191. @end
  192.  
  193.